package modele;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionBD implements iBdtheque, CollecBD{
	private ArrayList<Album> albums;
	private static BufferedWriter bw;
	private static BufferedReader br;
	//contient le chemin d'ou l'on as charge la bdteque
	private String cheminPere;

	//constructeur
	public CollectionBD(ArrayList <Album> arrayList) {
		albums=arrayList;
	}
	public CollectionBD(){
		albums=new ArrayList<Album>();
	}

	//fonctions initiales
	public ArrayList<Album> getAlbums(){
		return albums;	
	}
	public Album getAlbumIn(int pos){
		return albums.get(pos);
	}
	public void add(Album album) {
		albums.add(album);
	}
	public void supprimer(Album album) {
		albums.remove(album);
	}


	//Gestion des Titres
	public CollectionBD getSousCollecByTitre(String titre) {
		CollectionBD souscollec=new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getTitre()).toLowerCase().matches("[\\w\\W]*"+titre.toLowerCase()+"[\\w\\W]*")){
				souscollec.add(albums.get(i));
			}
		}
		return souscollec;
	}
	public ArrayList<String> getTitres() {
		return getTitres("");
	}
	public Set<String> getSetTitres() {

		return getSetTitres("");
	}	
	public ArrayList<String> getTitres(String titre) {
		ArrayList<String> listTitres=new ArrayList<String>();
		listTitres.addAll(getSetTitres(titre));
		Collections.sort(listTitres);
		return listTitres;
	}
	public Set<String> getSetTitres(String titre) {
		Set<String> titres = new HashSet<String>();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getTitre()).toLowerCase().matches("[\\w\\W]*"+titre.toLowerCase()+"[\\w\\W]*")){
				titres.add(albums.get(i).getTitre());
			}
		}
		return titres;
	}

	//Gestion des Auteurs
	public CollectionBD getSousCollecByAuteur(String auteur){
		CollectionBD sousCollec = new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getAuteurs()).toLowerCase().matches("[\\w\\W]*"+auteur.toLowerCase()+"[\\w\\W]*")){
				sousCollec.add(albums.get(i));
			}
		}
		return sousCollec;
	}
	public List<String>getAuteurs(){
		return getAuteurs("");
	}
	public Set<String> getSetAuteurs() {
		return getSetAuteurs("");
	}
	public ArrayList<String> getAuteurs(String nom) {
		ArrayList<String> listAuteurs=new ArrayList<String>();
		listAuteurs.addAll(getSetAuteurs(nom));
		Collections.sort(listAuteurs);
		return listAuteurs;
	}
	public Set<String> getSetAuteurs(String nom) {
		Set<String> auteurs = new HashSet<String>();
		String[] auteursSepares;
		for(int i =0; i != albums.size(); ++i){
			String tmp=(""+albums.get(i).getAuteurs());
			auteursSepares=tmp.split(", ");
			for(int j =0; j != auteursSepares.length; ++j){
				if((auteursSepares[j]).toLowerCase().matches("[\\w\\W]*"+nom.toLowerCase()+"[\\w\\W]*")){
					auteurs.add(auteursSepares[j]);
				}	
			}
		}	
		return auteurs;
	}


	//Gestion des Editeurs	
	public CollectionBD getSousCollecByEditeur(String editeur) {
		CollectionBD souscollec=new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getEditeur()).toLowerCase().matches("[\\w\\W]*"+editeur.toLowerCase()+"[\\w\\W]*")){
				souscollec.add(albums.get(i));
			}
		}
		return souscollec;
	}
	public List<String>getEditeurs(){
		return getEditeurs("");
	}
	public Set<String> getSetEditeurs() {
		return getSetEditeurs("");
	}
	public ArrayList<String> getEditeurs(String nom) {
		ArrayList<String> listEditeures=new ArrayList<String>();
		listEditeures.addAll(getSetEditeurs(nom));
		Collections.sort(listEditeures);
		return listEditeures;
	}
	public Set<String> getSetEditeurs(String nom) {
		Set<String> editeurs = new HashSet<String>();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getEditeur()).toLowerCase().matches("[\\w\\W]*"+nom.toLowerCase()+"[\\w\\W]*")){
				editeurs.add(albums.get(i).getEditeur());
			}
		}	
		return editeurs;
	}

	//Gestion des Genres
	public CollectionBD getSousCollecByGenre(String genre) {
		CollectionBD sousCollec = new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getGenres()).toLowerCase().matches("[\\w\\W]*"+genre.toLowerCase()+"[\\w\\W]*")){
				sousCollec.add(albums.get(i));
			}
		}
		return sousCollec;
	}
	public List<String>getGenres(){
		return getGenres("");
	}
	public Set<String> getSetGenres() {
		return getSetGenres("");
	}
	public ArrayList<String>getGenres(String genres){
		ArrayList<String> listGenres=new ArrayList<String>();
		listGenres.addAll(getSetGenres(genres));
		Collections.sort(listGenres);
		return listGenres;
	}
	public Set<String> getSetGenres(String genres) {
		Set<String> GenresSet = new HashSet<String>();
		String[] genreSepares;

		for(int i =0; i != albums.size(); ++i){
			String tmp=(""+albums.get(i).getGenres());
			genreSepares=tmp.split(", ");
			for(int j =0; j != genreSepares.length; ++j){
				if((genreSepares[j]).toLowerCase().matches("[\\w\\W]*"+genres.toLowerCase()+"[\\w\\W]*")){
					GenresSet.add(genreSepares[j]);
				}
			}
		}	
		return GenresSet;
	}

	//Gestion des Dessinateurs
	public CollectionBD getSousCollecByDessinateur(String dessinateur){
		CollectionBD sousCollec = new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getDessinateurs()).toLowerCase().matches("[\\w\\W]*"+dessinateur.toLowerCase()+"[\\w\\W]*")){
				sousCollec.add(albums.get(i));
			}
		}
		return sousCollec;
	}
	public List<String>getDessinateurs(){
		return getDessinateurs("");
	}
	public Set<String> getSetDessinateurs() {
		return getSetDessinateurs("");
	}
	public ArrayList<String> getDessinateurs(String nom) {
		ArrayList<String> listDessinateurs=new ArrayList<String>();
		listDessinateurs.addAll(getSetDessinateurs(nom));
		Collections.sort(listDessinateurs);
		return listDessinateurs;
	}
	public Set<String> getSetDessinateurs(String nom) {
		Set<String> Dessinateurs = new HashSet<String>();
		String[] DessinateursSepares;
		for(int i =0; i != albums.size(); ++i){
			String tmp=(""+albums.get(i).getDessinateurs());
			DessinateursSepares=tmp.split(", ");
			for(int j =0; j != DessinateursSepares.length; ++j){
				if((DessinateursSepares[j]).toLowerCase().matches("[\\w\\W]*"+nom.toLowerCase()+"[\\w\\W]*")){
					Dessinateurs.add(DessinateursSepares[j]);
				}	
			}
		}	
		return Dessinateurs;
	}

	//Gestion des Dates
	public CollectionBD getSousCollecByAnnee(String annee) {
		CollectionBD souscollec=new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getAnnee()).toLowerCase().matches("[\\w\\W]*"+annee.toLowerCase()+"[\\w\\W]*")){
				souscollec.add(albums.get(i));
			}
		}
		return souscollec;
	}
	public List<String> getDate(){
		return getDate("");
	}
	public Set<String> getSetDate(){
		return getSetDate("");
	}
	public ArrayList<String> getDate(String date) {
		ArrayList<String> listDates=new ArrayList<String>();
		listDates.addAll(getSetDate(date));
		Collections.sort(listDates);
		return listDates;
	}
	public Set<String> getSetDate(String date) {
		Set<String> dates = new HashSet<String>();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getAnnee()).toLowerCase().matches("[\\w\\W]*"+date.toLowerCase()+"[\\w\\W]*")){
				dates.add(albums.get(i).getAnnee());
			}
		}
		return dates;
	}

	//Gestion de la note
	public CollectionBD getSousCollecByNote(String note) {
		CollectionBD souscollec=new CollectionBD();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getNote()).toLowerCase().matches("[\\w\\W]*"+note.toLowerCase()+"[\\w\\W]*")){
				souscollec.add(albums.get(i));
			}
		}
		return souscollec;
	}
	public List<String> getNote(){
		return getNote("");
	}
	public Set<String> getSetNote(){
		return getSetNote("");
	}
	public ArrayList<String> getNote(String note) {
		ArrayList<String> listNotes=new ArrayList<String>();
		listNotes.addAll(getSetNote(note));
		Collections.sort(listNotes);
		return listNotes;
	}
	public Set<String> getSetNote(String note) {
		Set<String> notes = new HashSet<String>();
		for(int i =0; i != albums.size(); ++i){
			if((albums.get(i).getNote()).toLowerCase().matches("[\\w\\W]*"+note.toLowerCase()+"[\\w\\W]*")){
				notes.add(albums.get(i).getNote());
			}
		}
		return notes;
	}

	//Gestion des sauvegardes
	public static boolean sauvegarder(CollectionBD collec,String chemin){
		try{
			FileWriter fw = new FileWriter(chemin, false); 
			bw = new BufferedWriter(fw);
			for(Album a:collec.albums){
				bw.write(a.toString()+"\n");
			}
			bw.flush();

			return true;
		}catch(IOException e){
			return false;
		}
	}
	public static CollectionBD genererBDteque(String chemin){
		try{
			FileReader fr=new FileReader(chemin);
			br = new BufferedReader(fr);
			String s;
			CollectionBD collec=new CollectionBD();
			while ((s=br.readLine()) != null) {
				String []champs=s.split("\\|");

				ArrayList<String>auteurs=new ArrayList<String>();
				champs[3]=champs[3].substring(1,champs[3].length()-1);
				String[] sauteurs= champs[3].split(",");

				for(String auteur:sauteurs){
					auteurs.add(auteur.trim());
				}
				ArrayList<String> dessinateurs=new ArrayList<String>();
				champs[6]=champs[6].substring(1,champs[6].length()-1);
				String[] sdessinateurs=champs[6].split(",");
				System.out.println("1er");
				for(String dessinateur:sdessinateurs){
					dessinateurs.add(dessinateur.trim());
				}
				ArrayList<String>genres=new ArrayList<String>();
				champs[2]=champs[2].substring(1,champs[2].length()-1);
				String[] sgenres=champs[2].split(",");
				for(String genre:sgenres){
					genres.add(genre.trim());
				}
				collec.add(new Album(champs[0], champs[1],genres, auteurs, Integer.parseInt(champs[4]),champs[5], dessinateurs,Integer.parseInt(champs[7]),new String(champs[8])));
			}
			fr.close();
			br.close();
			collec.cheminPere=chemin;
			return collec;
		}catch(IOException e){
			return null;
		}
	}
	public String getCheminPere(){
		return cheminPere;
	}
	/**
	 * 
	 * @param titre
	 * @return vrai si la liste a d�ja ce un album ayant le titre mis en parametre
	 */
	public boolean exist(String titre) {
		for(String a:this.getTitres(titre)){
			if(titre.equals(a))return true;
		}
		return false;
	}
	/**
	 * 
	 * @return la nom des colonnes du tableau
	 */
	public String[] getHeadTable(){
		String[] head=new String[7];
		head[0]="Titre";
		head[1]="Genres";
		head[2]="Auteurs";	
		head[3]="Dessinateurs";
		head[4]="Editeur";
		head[5]="Annee";
		head[6]="Note";
		return head;
	}
	/**
	 * 
	 * @return tous ce que contient la collec sous fomre d'un tableau
	 */
	public Object[][] getDataTable(){
		Object[][] data=new String[albums.size()][7];
		int i =0;
		for(Album album:albums){
			data[i][0]=album.getTitre();
			data[i][1]=album.getGenres();
			data[i][2]=album.getAuteurs();
			data[i][3]=album.getDessinateurs();
			data[i][4]=album.getEditeur();
			data[i][5]=(String) album.getAnnee();
			data[i][6]=album.getNote();
			i++;
		}

		return data;
	}



}
